#include <bits/stdc++.h>
using namespace std;
const int N = 1e6;
int q[N + 10];
int tmp[N +10];
int n;
// 分治  
// 1. 确定分界点  mid = (l+r)/2  2.递归的排序lef right 3. 归一  ----难点 
// 双指针算法
void merge_sort(int q[], int l, int r){
    if(l >= r) return; // 超出边界，或者区间内没有数
    int mid = (l + r) / 2; // 移位法 除以2  // 不能l + r + 1 否则越界
    merge_sort(q, l, mid), merge_sort(q, mid + 1, r);

    // 开始合二为一
    int k = 0, i = l, j = mid + 1;
    while(i <= mid && j <= r)      // 左半边和右半边都有循环空的时候 
        if(q[i] <= q[j]) tmp[k++] = q[i++];
        else tmp[k++] = q[j++];
    while(i <= mid) tmp[k++] = q[i++];
    while(j <= r) tmp[k++] = q[j++];
    // tmp 复制给 p
    for(int i = l, j = 0; i <= r; i++ , j++) q[i] = tmp[j];  
}

int main(){
    cin >> n;
    for(int i = 0; i < n; i++) cin >> q[i];
    merge_sort(q, 0, n - 1);
    for(int i  = 0; i < n; i++){
        cout << q[i];
        if(i != n -1) cout << " ";
    }
    return 0;
}